#!/usr/bin/python
#coding:utf-8
'''
numpy库
    创建矩阵数据模型，操作数据
http://blog.csdn.net/cxmscb/article/details/54583415
'''
import numpy as np
import sys

#打印中文
def say(context):
    type=sys.getfilesystemencoding()
    print context.decode('utf-8').encode(type)

say("------------列表转化数组---------------------")
say('使用列表生成一维数组')
data=[1,2,3,4,5,6]
x=np.array(data,dtype=np.int32)  #dtype指定元素类型，非必填项
print x #打印数组
print x.dtype  #打印数组元素类型

say('使用列表生成二维数组')
data=[[1,2],[3,4],[5,6]]
x=np.array(data)  #x.ndim 数组纬度
say("数组纬度："+str(x.ndim))

print
say("------------创建数组---------------------")
say("创建一维长度6，元素0的一维数组")
x=np.zeros(6)
print x
say("创建一维长度2，二维长度为3，二维0数组")
x=np.zeros((2,3))
print x
say("创建一维长度2，二维长度为3，二维1数组")
x=np.ones((2,3))
print x
say("创建一维长度2，二维长度为3，未初始化的二维数组")
x=np.empty((2,3))
print x

print
say("------------生成连续元素---------------------")
print np.arange(6)
print np.arange(0,6,2)

print
say("------------元素类型转换---------------------")
x =np.array([1,2,3],dtype=np.float64)
print x.dtype
x= x.astype(np.int32)
print x.dtype
x =np.array([1,2,3],dtype=np.string_)
print x
x=x.astype(np.int32)
say("字符串转数值"+str(x))

#使用其他数组的数据类型转参数
x=np.array([1,2,3],dtype=np.float32)
y = np.arange(3,dtype=np.int32)
print y
print x.dtype
print y.astype(x.dtype)

print
say("------------数据矢量计算---------------------")
x= np.array([1,2,3])
print x*2
print x>2
y=np.array([3,4,5])
print x+y
print x>y

print
say("------------数据索引和切片---------------------")
x=np.array([[1,2],[3,4],[5,6]])
print x[0]
print x[0][1]
print x[0,1]

x=np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
print "0:",x[0]
y= x[0].copy()  #生成一个副本
z= x[0]  #未生成一个副本
print "Y:",y
print y[0,0]
y[0,0] =0
z[0,0] = -1
print 'Y:',y
print 'X[0]:',x[0]
print "Z",z

print
say("------------ndarray切片---------------------")
x= np.array([1,2,3,4,5])
print x[1:3] #右边开区间
print x[:3] #左边默认0
print x[1:] #右边默认为元素个数
print x[0:4:2] #下标递增2
print x[0:6:3] #下标递增2

x=np.array([[1,2],[3,4],[5,6]])
print x[:2]
print x[:2,:1]
x[:2,:1]=0
print x
x[:2,:1] =[[8],[6]]
print x

print
say("------------布尔索引---------------------")
x= np.array([3,2,3,1,3,0])
#布尔索引长度必须与被索引的轴长一致
y=np.array([True,False,True,False,True,False])
print x[y]
print x[y==False]
print x>=3
print x[~(x>=3)]
print (x==2)|(x==1)
print x[(x==2)|(x==1)]
x[(x==2)|(x==1)]=0
print x

print
say("------------花式索引---------------------")
x=np.array([1,2,3,4,5,6])
print '0-1-2:',x[[0,1,2]]
print '0-1-2:',x[[-1,-2,-3]]

x= np.array([[1,2],[3,4],[5,6]])
print '0-1:',x[[0,1]]
print '0-:',x[[0,1],[0,1]]
print '0-1:',x[np.ix_([0,1],[0,1])]
x[[0,1],[0,1]] =[0,0]  #x[0,0]和x[1,1]
print 'x:',x

print
say("------------专制和轴对称---------------------")
k=np.arange(9)  #创建0~8
m=k.reshape((3,3))
print k
say('转换成矩阵'+str(m))
say('矩阵转置'+str(m.T))
say('矩阵内积'+str(np.dot(m,m.T)))
#高维数组轴对象
k=np.arange(8).reshape(2,2,2)
print k
print k[1][0][0]
#轴变换
m = k.transpose((1,0,2)) #m[y][x][z] = k[x][y][z]
say('轴变换'+str(m))
print m[0][1][0]
#轴交换
m= k.swapaxes(0,1)  #m[y][x][z] =k [x][y][z]
say('轴交换'+str(m))
print m[0][1][0]

#使用轴交换实现数组矩阵转置
m =np.arange(9).reshape((3,3))
print m
print m.swapaxes(1,0)

print
say("------------where函数使用---------------------")
cond =np.array([True,False,True,False])
x=np.where(cond,-2,2)
print x
cond = np.array([1,2,3,4])
x = np.where(cond>2,-2,2)
print x

#嵌套
y1= np.array([-1,-2,-3,-4,-5,-6])
y2 = np.array([1,2,3,4,5,6])
y3= np.zeros(6)
cond = np.array([1,2,3,4,5,6])
x = np.where(cond>5,y3,np.where(cond>2,y1,y2))
print x

print
say("------------统计方法---------------------")
x = np.array([[2,1],[3,3],[1,2]])
print x.mean()       #平均数
print x.mean(axis=1) #求每一行元素平均数
print x.mean(axis=0) #求每一列元素平均数
print x.sum()        #求和
print x.sum(axis=1)
print x.max()
print x.max(axis=1)
print x.cumsum()     #所有元素的累积和
print x.cumprod()    #所有元素的累积积
x.sort(axis=1)
print x

print
say("------------去重和集合运算---------------------")
x=np.array([[1,6,2],[6,1,3],[1,5,2]])
print np.unique(x)  #去重
y =np.array([1,6,5])
print np.in1d(x,y)
print np.setdiff1d(x,y)
print np.intersect1d(x,y)

print
say("------------线性代数---------------------")
x = np.array([[1,2],[3,4]])
y= np.array([[1,3],[2,4]])
print x.dot(y)  #矩阵乘法
print np.dot(x,y)
say("矩阵求逆")
x = np.array([[1,1],[1,2]])
print x.dot(y)
print np.linalg.det(x) #求行列式

print
say("------------随机数生成---------------------")
x=np.random.randint(0,2,size=100000) #抛硬币
print(x>0).sum()  #正面的结果
print np.random.normal(size=(2,2)) #正太分布随机数组

print
say("------------数据重塑---------------------")
x = np.arange(0,6)
print x.reshape((2,3))
y=x.reshape((2,3))  #拆分
print y.flatten()   #恢复

print
say("------------数组拆分与合并---------------------")
x = np.array([[1,2,3],[4,5,6]])
y=np.array([[7,8,9],[10,11,12]])
say("竖直重组"+str(np.concatenate([x,y],axis=0)))
say("水平重组"+str(np.concatenate([x,y],axis=1)))
say("竖直重叠"+str(np.vstack([x,y])))
say("水平重叠"+str(np.hstack([x,y])))
say("按行分割"+str(np.split(x,2,axis=0)))
say("按列分割"+str(np.split(x,3,axis=1)))
arr=np.arange(6)
arr1=arr.reshape((3,2))
arr2 = np.random.randn(3,2)

say("r_用于行堆叠"+str(np.r_[arr1,arr2]))
say("c_用于列堆叠"+str(np.c_[arr1,arr2]))
say("切片直接转数组"+str(np.c_[1:6,-10:-5]))

print
say("------------数组重复---------------------")
x = np.array([[1,2],[3,4]])
say("按元素重复"+str(x.repeat(2)))
say("按行重复"+str(x.repeat(2,axis=0)))
say("按列重复"+str(x.repeat(2,axis=1)))
x = np.array([1,2])
say("瓦片"+str(np.tile(x,2)))
say("瓦片,指定从低维到高维依次复制次数"+str(np.tile(x,(2,2))))
